﻿using System;
using System.Reflection;

namespace WinForms.Framework.Utility
{
    /// <summary>
    /// 属性関係のユーティリティクラスです。
    /// </summary>
    public static class Attributer
    {
        /// <summary>
        /// 指定したメンバー情報に、対象の属性タイプを持っているかどうかを取得します。
        /// </summary>
        /// <param name="memberInfo">メンバー情報</param>
        /// <param name="attributeType">属性タイプ</param>
        /// <returns>持っている場合：true、持っていない場合：false</returns>
        public static bool HasAttribute(MemberInfo memberInfo, Type attributeType)
        {
            return memberInfo.GetCustomAttributes(attributeType, false).Length > 0;
        }

        /// <summary>
        /// 指定したモデルタイプのプロパティに、対象の属性タイプを持っているかどうかを取得します。
        /// </summary>
        /// <param name="modelType">モデルタイプ</param>
        /// <param name="propertyName">プロパティ名</param>
        /// <param name="attributeType">属性タイプ</param>
        /// <returns>持っている場合：true、持っていない場合：false</returns>
        public static bool HasAttribute(Type modelType, string propertyName, Type attributeType)
        {
            return modelType.GetProperty(propertyName).GetCustomAttributes(attributeType, false).Length > 0;
        }

        /// <summary>
        /// 指定したメンバー情報から、対象の属性タイプを取得します。
        /// </summary>
        /// <param name="memberInfo">メンバー情報</param>
        /// <returns>対象の属性タイプ。</returns>
        public static T GetAttribute<T>(MemberInfo memberInfo) where T : Attribute
        {
            return (T)memberInfo.GetCustomAttributes(typeof(T), false)[0];
        }

        /// <summary>
        /// 指定したモデルタイプのプロパティから、対象の属性タイプを取得します。
        /// </summary>
        /// <param name="modelType">モデルタイプ</param>
        /// <param name="propertyName">プロパティ名</param>
        /// <returns>対象の属性タイプ。</returns>
        public static T GetAttribute<T>(Type modelType, string propertyName) where T : Attribute
        {
            return (T)modelType.GetProperty(propertyName).GetCustomAttributes(typeof(T), false)[0];
        }
    }
}